package channel

type (
	ErrorContext interface {
		Context
		Err() error
		bindErr(err error)
	}

	ErrorHandler interface {
		HandleError(ctx ErrorContext) error
	}
)

type errorContext struct {
	commonContext
	err error
}

func (e *errorContext) bindErr(err error) {
	e.err = err
}

func (e *errorContext) Next() error {
	e.index++
	for e.index < int8(len(e.handlers)) {
		if h, ok := e.handlers[e.index].(ErrorHandler); ok {
			err := h.HandleError(e)
			if err != nil {
				return err
			}
		}
		e.index++
	}
	return nil
}

func (e *errorContext) Err() error {
	return e.err
}
